package model;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Sudoku {
	
	public byte[][] byteSudokuFeld = new byte[9][9];
	
	
	
	public boolean pruefeRichtigkeit() {
		byte byteZeile;
		byte byteSpalte;
		byte byteAktuelleZeile;
		byte byteAktuelleSpalte;
		
		
		//Gesamtes Spielfeld durchlaufen
		for (byteZeile=0; byteZeile<9; byteZeile++) {
			for (byteSpalte=0; byteSpalte<9; byteSpalte++) {
				
				// aktuellen Spalten- und Zeilenwert speichern, um sie zu ueberpruefen
				byteAktuelleZeile = byteZeile;
				byteAktuelleSpalte = byteSpalte;
				
				//Zeile auf doppelte Zahl ueberpruefen
				//Aktuelles Feld bezeichnet in diesem Fall die Spalte
				for (byte byteAktuellesFeld=0; byteAktuellesFeld<9; byteAktuellesFeld++) {
					if (byteAktuelleZeile == byteZeile && byteAktuelleSpalte == byteAktuellesFeld) {
						//Wenn dies zutrifft, wird das selbe Element verglichen, was ausgeschlossen werden sollte
					}
					else if (byteSudokuFeld[byteAktuelleZeile][byteAktuelleSpalte] == byteSudokuFeld[byteZeile][byteAktuellesFeld] && byteSudokuFeld[byteZeile][byteAktuellesFeld] !=0) {
						//Wenn dies zutrifft, ist eine Zahl doppelt vorhanden
						return false;
					}
				}
				
				//Spalte auf doppelte Zahl ueberpruefen
				//Aktuelles Feld bezeichnet in diesem Fall die Zeile
				for (byte byteAktuellesFeld=0; byteAktuellesFeld<9; byteAktuellesFeld++) {
					if (byteAktuelleZeile == byteAktuellesFeld && byteAktuelleSpalte == byteSpalte) {
						//Wenn dies zutrifft, wird das selbe Element verglichen, was ausgeschlossen werden sollte
					}
					else if (byteSudokuFeld[byteAktuelleZeile][byteAktuelleSpalte] == byteSudokuFeld[byteAktuellesFeld][byteSpalte] && byteSudokuFeld[byteAktuellesFeld][byteAktuelleSpalte] != 0) {
						//Wenn dies zutrifft, ist eine Zahl doppelt vorhanden
						return false;
					}
				}
				
				//�berpr�fen im selben 3x3 Feld
				byte byteZeilenMultiplikator;
				byte byteSpaltenMultiplikator;
				byte byteFeldDivisor = 3;
				
				//Deklarieren der Multiplikatoren
				byteZeilenMultiplikator = (byte) (byteAktuelleZeile / byteFeldDivisor);
				byteSpaltenMultiplikator = (byte) (byteAktuelleSpalte / byteFeldDivisor);
				
				//Durchlaufen der 3x3 Felder in Abh�ngigkeit der Feldmultiplikatoren
				for (byte byteUnterZeile=0; byteUnterZeile < 3; byteUnterZeile++) {
					for (byte byteUnterSpalte=0; byteUnterSpalte < 3; byteUnterSpalte++) {
						if (byteAktuelleZeile == (byteUnterZeile+3*byteZeilenMultiplikator) && byteAktuelleSpalte == (byteUnterSpalte+3*byteSpaltenMultiplikator)) {
							//Wenn dies zutrifft, wird das selbe Element verglichen, was ausgeschlossen werden sollte
						}
						else if (byteSudokuFeld[byteAktuelleZeile][byteAktuelleSpalte] == byteSudokuFeld[byteUnterZeile+3*byteZeilenMultiplikator][byteUnterSpalte+3*byteSpaltenMultiplikator] && byteSudokuFeld[byteUnterZeile+3*byteZeilenMultiplikator][byteUnterSpalte+3*byteSpaltenMultiplikator] != 0) {
							//Wenn dies zutrifft, ist eine Zahl doppelt vorhanden
							return false;
						}
					}
				}
			}
		}
		return true;
	}
	
	//Pruefe ob das Sudoku vollstaendig ist
	public boolean pruefeObVollstaendig() {
		
		//Durchlaufen des Sudokufeld
		for (byte byteZeile=0; byteZeile<9; byteZeile++) {
			for (byte byteSpalte=0; byteSpalte<9; byteSpalte++) {
				//Wenn das Feld nicht belegt (0 ist) ist die Pruefung fehlgeschlagen
				if (byteSudokuFeld[byteZeile][byteSpalte]==0) {
					return false;
				}
			}
		}
		
		return true;
	}
	
	//Initialisiere das Sudokufeld mit Nullen
	public void erstelleLeeresFeld() {
		for (byte byteZeile=0; byteZeile<9; byteZeile++) {
			for (byte byteSpalte=0; byteSpalte<9; byteSpalte++) {
				byteSudokuFeld[byteZeile][byteSpalte]=0;
			}
		}
	}
}
